/**
 * 病友圈状态管理 Slice
 * 使用 Redux Toolkit 管理病友圈相关的状态
 * 包括病友圈数据、科室列表、分页等信息的管理
 */

// src/store/slices/momentsSlice.ts
import { createSlice, PayloadAction } from '@reduxjs/toolkit';

/**
 * 病友圈状态接口定义
 * @interface MomentsState
 * @property {any[]} data - 病友圈数据列表
 * @property {any[]} departments - 科室列表
 * @property {number | null} activeDept - 当前选中的科室ID
 * @property {boolean} loading - 加载状态标志
 * @property {string | null} error - 错误信息
 * @property {number} page - 当前页码
 * @property {boolean} hasMore - 是否还有更多数据
 */
interface MomentsState {
  data: any[];
  departments: any[];
  activeDept: number | null;
  loading: boolean;
  error: string | null;
  page: number;
  hasMore: boolean;
}

/**
 * 初始状态
 * 设置病友圈状态的默认值
 */
const initialState: MomentsState = {
  data: [],
  departments: [],
  activeDept: null,
  loading: false,
  error: null,
  page: 1,
  hasMore: true,
};

/**
 * 创建病友圈状态切片
 * 包含以下操作：
 * - setData: 设置病友圈数据
 * - appendData: 追加病友圈数据（用于加载更多）
 * - setDepartments: 设置科室列表
 * - setActiveDept: 设置当前选中的科室
 * - setLoading: 设置加载状态
 * - setError: 设置错误信息
 * - setPage: 设置当前页码
 * - setHasMore: 设置是否还有更多数据
 */
const momentsSlice = createSlice({
  name: 'moments',
  initialState,
  reducers: {
    /**
     * 设置病友圈数据
     * @param state - 当前状态
     * @param action - 包含病友圈数据数组
     */
    setData: (state, action: PayloadAction<any[]>) => {
      state.data = action.payload;
    },
    /**
     * 追加病友圈数据
     * 用于实现加载更多功能
     * @param state - 当前状态
     * @param action - 包含要追加的病友圈数据数组
     */
    appendData: (state, action: PayloadAction<any[]>) => {
      state.data = [...state.data, ...action.payload];
    },
    /**
     * 设置科室列表
     * @param state - 当前状态
     * @param action - 包含科室列表数组
     */
    setDepartments: (state, action: PayloadAction<any[]>) => {
      state.departments = action.payload;
    },
    /**
     * 设置当前选中的科室
     * @param state - 当前状态
     * @param action - 包含科室ID的数字
     */
    setActiveDept: (state, action: PayloadAction<number>) => {
      state.activeDept = action.payload;
    },
    /**
     * 设置加载状态
     * @param state - 当前状态
     * @param action - 包含加载状态的布尔值
     */
    setLoading: (state, action: PayloadAction<boolean>) => {
      state.loading = action.payload;
    },
    /**
     * 设置错误信息
     * @param state - 当前状态
     * @param action - 包含错误信息的字符串
     */
    setError: (state, action: PayloadAction<string | null>) => {
      state.error = action.payload;
    },
    /**
     * 设置当前页码
     * @param state - 当前状态
     * @param action - 包含页码的数字
     */
    setPage: (state, action: PayloadAction<number>) => {
      state.page = action.payload;
    },
    /**
     * 设置是否还有更多数据
     * @param state - 当前状态
     * @param action - 包含是否有更多数据的布尔值
     */
    setHasMore: (state, action: PayloadAction<boolean>) => {
      state.hasMore = action.payload;
    },
  },
});

// 导出所有 actions 和 reducer
export const {
  setData,
  appendData,
  setDepartments,
  setActiveDept,
  setLoading,
  setError,
  setPage,
  setHasMore,
} = momentsSlice.actions;
export default momentsSlice.reducer;